package org.an.proj.contacts.ui.test;

import android.content.res.ColorStateList;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.ColorRes;
import android.support.annotation.Nullable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.BackgroundColorSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.ScaleXSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.SubscriptSpan;
import android.text.style.SuperscriptSpan;
import android.text.style.TextAppearanceSpan;
import android.text.style.TypefaceSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import org.an.proj.contacts.R;
import org.an.proj.contacts.ui.base.BaseActivity;

import static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;

/**
 * 测试 SpanTextView
 */
public class SpanTextViewActivity extends BaseActivity {
  private static final String TAG = "SpanTextViewDemo";

  @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  }

  private void setTextView() {
    TextView textView = (TextView) findViewById(R.id.textview);
    // 创建一个 SpannableString对象
    String msg = "字体测试字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站短信彩信地图X轴综合/bot边框";
    //textView.append(span("字体", 12, false, R.color.black));
    textView.append("字体");
    textView.append(span("测试", 18, true, R.color.color_00beb3));
    textView.append("哈哈");
    //textView.append(span("字体", 15, false, R.color.color_41bc6a));
    //textView.append(span("大小", 12, false, R.color.black));
    textView.append("大小");
  }

  private SpannableStringBuilder span(String string, int size, boolean isBold,
      @ColorRes int color) {
    /*int flags：取值有如下四个
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE：前后都不包括，即在指定范围的前面和后面插入新字符都不会应用新样式
    Spannable.SPAN_EXCLUSIVE_INCLUSIVE	：前面不包括，后面包括。即仅在范围字符的后面插入新字符时会应用新样式
    Spannable.SPAN_INCLUSIVE_EXCLUSIVE	：前面包括，后面不包括。
    Spannable.SPAN_INCLUSIVE_INCLUSIVE	：前后都包括。*/

    /*object what ：对应的各种Span，后面会提到；
    int start：开始应用指定Span的位置，索引从0开始
    int end：结束应用指定Span的位置，特效并不包括这个位置。
    比如如果这里数为3（即第4个字符），第4个字符不会有任何特效。从下面的例子也可以看出来。*/

    SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(string);
    if (isBold) {
      spannableStringBuilder.setSpan(new StyleSpan(Typeface.BOLD), 0, string.length(),
          Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    }
    spannableStringBuilder.setSpan(new AbsoluteSizeSpan(size, true), 0, string.length(),
        Spanned.SPAN_INCLUSIVE_INCLUSIVE);

    spannableStringBuilder.setSpan(new ForegroundColorSpan(getResources().getColor(color)), 0,
        string.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
    return spannableStringBuilder;
  }

  private void setTextView2() {
    // 创建一个 SpannableString对象
    String msg = "字体测试字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站短信彩信地图X轴综合/bot边框";
    SpannableString msp = new SpannableString(msg);

    // 设置字体(default,default-bold,monospace,serif,sans-serif)
    msp.setSpan(new TypefaceSpan("monospace"), 0, 2, SPAN_EXCLUSIVE_EXCLUSIVE);
    msp.setSpan(new TypefaceSpan("serif"), 2, 4, SPAN_EXCLUSIVE_EXCLUSIVE);

    // 设置字体大小（绝对值,单位：像素）：
    msp.setSpan(new AbsoluteSizeSpan(20), 4, 6, SPAN_EXCLUSIVE_EXCLUSIVE);
    msp.setSpan(new AbsoluteSizeSpan(20, true), 6, 8, SPAN_EXCLUSIVE_EXCLUSIVE); // 第二个参数boolean
    // dip，如果为true，表示前面的字体大小单位为dip，否则为像素，同上。

    // 设置字体大小（相对值,单位：像素） 参数表示为默认字体大小的多少倍
    msp.setSpan(new RelativeSizeSpan(0.5f), 8, 10, SPAN_EXCLUSIVE_EXCLUSIVE); // 0.5f表示默认字体大小的一半
    msp.setSpan(new RelativeSizeSpan(2.0f), 10, 12, SPAN_EXCLUSIVE_EXCLUSIVE); // 2.0f表示默认字体大小的两倍

    // 设置字体前景色
    msp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 12, 15,
        SPAN_EXCLUSIVE_EXCLUSIVE); // 设置前景色为洋红色

    // 设置字体背景色
    msp.setSpan(new BackgroundColorSpan(Color.CYAN), 15, 18, SPAN_EXCLUSIVE_EXCLUSIVE); // 设置背景色为青色

    // 设置字体样式正常，粗体，斜体，粗斜体
    msp.setSpan(new StyleSpan(Typeface.NORMAL), 18, 20, SPAN_EXCLUSIVE_EXCLUSIVE); // 正常
    msp.setSpan(new StyleSpan(Typeface.BOLD), 20, 22, SPAN_EXCLUSIVE_EXCLUSIVE); // 粗体
    msp.setSpan(new StyleSpan(Typeface.ITALIC), 22, 24, SPAN_EXCLUSIVE_EXCLUSIVE); // 斜体
    msp.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 24, 27, SPAN_EXCLUSIVE_EXCLUSIVE); // 粗斜体

    // 设置下划线
    msp.setSpan(new UnderlineSpan(), 27, 30, SPAN_EXCLUSIVE_EXCLUSIVE);

    // 设置删除线
    msp.setSpan(new StrikethroughSpan(), 30, 33, SPAN_EXCLUSIVE_EXCLUSIVE);

    // 设置上下标
    msp.setSpan(new SubscriptSpan(), 34, 35, SPAN_EXCLUSIVE_EXCLUSIVE); // 下标
    msp.setSpan(new SuperscriptSpan(), 36, 37, SPAN_EXCLUSIVE_EXCLUSIVE); // 上标

    // 超级链接（需要添加setMovementMethod方法附加响应）
    msp.setSpan(new URLSpan("tel:4155551212"), 37, 39, SPAN_EXCLUSIVE_EXCLUSIVE); // 电话
    msp.setSpan(new URLSpan("mailto:webmaster@google.com"), 39, 41, SPAN_EXCLUSIVE_EXCLUSIVE); // 邮件
    msp.setSpan(new URLSpan("http://www.baidu.com"), 41, 43, SPAN_EXCLUSIVE_EXCLUSIVE); // 网络
    msp.setSpan(new URLSpan("sms:4155551212"), 43, 45, SPAN_EXCLUSIVE_EXCLUSIVE); // 短信
    // 使用sms:或者smsto:
    msp.setSpan(new URLSpan("mms:4155551212"), 45, 47, SPAN_EXCLUSIVE_EXCLUSIVE); // 彩信
    // 使用mms:或者mmsto:
    msp.setSpan(new URLSpan("geo:38.899533,-77.036476"), 47, 49, SPAN_EXCLUSIVE_EXCLUSIVE); // 地图

    // 设置字体大小（相对值,单位：像素） 参数表示为默认字体宽度的多少倍
    msp.setSpan(new ScaleXSpan(2.0f), 49, 51,
        SPAN_EXCLUSIVE_EXCLUSIVE); // 2.0f表示默认字体宽度的两倍，即X轴方向放大为默认字体的两倍，而高度不变

    // 设置字体（依次包括字体名称，字体大小，字体样式，字体颜色，链接颜色）
    ColorStateList csl = getResources().getColorStateList(R.color.color);
    ColorStateList csllink = getResources().getColorStateList(R.color.linkcolor);

    msp.setSpan(new TextAppearanceSpan("monospace", Typeface.BOLD_ITALIC, 50, csl, csllink), 51, 53,
        SPAN_EXCLUSIVE_EXCLUSIVE);

    // 设置项目符号
    //        msp.setSpan(new BulletSpan(android.text.style.BulletSpan.STANDARD_GAP_WIDTH, Color.GREEN), 0,
    //                msp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 第一个参数表示项目符号占用的宽度，第二个参数为项目符号的颜色

    // 设置图片
    Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
    msp.setSpan(new ImageSpan(drawable), 53, 57, SPAN_EXCLUSIVE_EXCLUSIVE);

    // 设置边框
    Drawable bg = getResources().getDrawable(R.drawable.text_background);
    msp.setSpan(new ImageSpan(bg) {
      @Override
      public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top,
          int y, int bottom, Paint paint) {
        paint.setTypeface(Typeface.create("normal", Typeface.BOLD));
        paint.setTextSize(50);
        int len = Math.round(paint.measureText(text, start, end));
        getDrawable().setBounds(0, 0, len, 60);
        super.draw(canvas, text, start, end, x, top, y, bottom, paint);
        paint.setColor(Color.BLUE);
        paint.setTypeface(Typeface.create("normal", Typeface.BOLD));
        paint.setTextSize(40);
        canvas.drawText(text.subSequence(start, end).toString(), x + 10, y, paint);
      }
    }, 57, 59, SPAN_EXCLUSIVE_EXCLUSIVE);
    TextView textView = (TextView) findViewById(R.id.textview);
    textView.setText(msp);
    textView.setMovementMethod(LinkMovementMethod.getInstance());
  }
}
